<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /*
      继承：
        - 通过extens关键字来完成继承
        - 当一个类继承了另一个类，就相当于将另一个类中的代码，复制到了当前类中(简单理解)

        封装--安全性
        继承--扩展性
        多态--灵活性

        类中的属性会添加到原型对象中的情况：
          1.在类中通过xxx(){}方式添加的方法，位于原型之中。
          2.主动向原型中添加的属性或方法

    */
   class Animal {
    constructor(name) {
      this.name= name
    }
    sayHello() {
      console.log('动物在叫')
    }
   }
   class Dog extends Animal {
    // 在子类中，可以通过重写同名方法来覆盖从父类中继承的方法
    sayHello() {
      console.log('汪汪汪')
    }

   }
   class Cat extends Animal {
    // 重写构造函数 第一行代码必须为super()
    constructor(name, age) {
      super(name) // 表示调用父类的构造函数
      this.age = age
    }
    sayHello() {
      super.sayHello() // 调用父类中的sayHello
      console.log('喵喵喵')
    }
  }
  //  class Dog {
  //   constructor(name) {
  //     this.name= name
  //   }
  //   sayHello() {
  //     console.log('汪汪汪')
  //   }
  //  }
  //  class Cat {
  //   constructor(name) {
  //     this.name= name
  //   }
  //   sayHello() {
  //     console.log('喵喵喵')
  //   }
  //  }
   const dog = new Dog('旺财')
   const cat = new Cat('汤姆',3)
   dog.sayHello()
   cat.sayHello()
   console.log(cat)
   console.log(dog)
  </script>
</body>
</html>